#include "sort.hpp"

template<class T>
void print_arr(const std::vector<T>& arr)
{
    for(const int& num : arr)
    {
        std::cout << num << ' ';
    }
    std::cout << std::endl;
}

template<class T>
void bubble(std::vector<T> arr)
{
    bubble_sort(arr);
    print_arr<int>(arr);
}

template<class T>
void insert(std::vector<T> arr)
{
    insert_sort(arr);
    print_arr<int>(arr);
}

template<class T>
void select(std::vector<T> arr)
{
    select_sort(arr);
    print_arr<int>(arr);
}

template<class T>
void quick(std::vector<T> arr, int begin, int end)
{
    quick_sort(arr, begin, end);
    print_arr<int>(arr);
}

template<class T>
void merge(std::vector<T> arr, int begin, int end)
{
    merge_sort(arr, begin, end);
    print_arr<int>(arr);
}

template<class T>
void heap(std::vector<T> arr)
{
    Heap<T> heap(arr);
    
    while(!heap.empty())
    {
        std::cout << heap.top() << ' ';
        heap.pop();
    }
    std::cout << std::endl;
}

template<class T>
void shell(std::vector<T> arr)
{
    shell_sort(arr);
    print_arr<int>(arr);
}

int main()
{
    std::vector<int> arr{6, 2, 8, 9, 1, 4, 3, 7, 5, 0};
    print_arr<int>(arr);

    // 冒泡排序
    bubble<int>(arr);

    // 插入排序
    insert<int>(arr);

    // 选择排序
    select<int>(arr);

    // 快速排序
    quick<int>(arr, 0, arr.size() - 1);

    // 归并排序
    merge<int>(arr, 0, arr.size() - 1);

    // 堆排序
    heap<int>(arr);

    // 希尔排序
    shell<int>(arr);

    return 0;
}